home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / MIDI8031 / SCHRITT.S51 < prev    next >
Encoding:
Text File  |  1987-04-21  |  3.6 KB  |  122 lines

  1. ; ******************************************************
  2. ; * SCHRITT: Dieses Programm steuert 2 Schrittmotoren  *
  3. ; * Die Drehzahl der beiden Motoren empfaengt MIDI8031 *
  4. ; * ueber MIDI (was sonst), dazu dient das Steuer-     *
  5. ; * programm in GFA-Basic: SCHRITT.TXT.                *
  6. ; ******************************************************
  7.  
  8.     .registers reg51.inc
  9.  
  10. ; *** Variablen Internes RAM, oberhalb BITFELD***
  11.     .var_org $30        ; Variablen-PC setzen
  12.  
  13. speed0: .ds.b 1            ; -64..0..64 Motorgeschw. Motor 0
  14. nach0:    .ds.b 1            ; Nachkommastellen
  15. pos0:    .ds.b 1            ; Motormosition (0..3)
  16. speed1:    .ds.b 1            ; dto. Motor 1
  17. nach1:    .ds.b 1            ; dto.
  18. pos1:    .ds.b 1            ; dto.
  19. awert:    .ds.b 1            ; Hilfsvariable 
  20. stack:                    ; Ab hier das restliche RAM fuer den Stack
  21.  
  22. ; *** Code: Ab hier beginnt das eigentliche Programm ***
  23.  
  24.     .text_org $8000
  25.  
  26. ; *** 'Interruptbereich' wie EPROM ab Adresse 0 ***
  27.         ljmp go            ; Interruptbereich ueberspringen
  28. int0:    reti            ; Nicht verwendet...
  29.         .ds.b 7
  30. timer0:    ljmp steppen    ; zum steppen springen
  31.         .ds.b 5
  32. int1:    reti            ; int0/1, timer1, serial
  33.         .ds.b 7            ; werden in diesem Programm
  34. timer1:    reti            ; nicht verwendet. Der Programm-
  35.         .ds.b 7            ; kopf zeigt lediglich, was mit
  36. serial:    reti            ; MIDI8031 moglich waere.
  37.         .ds.b 7
  38.  
  39. ; *** Hier startet das eigentliche Programm ***
  40.  
  41. ; * Initialisierungen: Variablen & Interrupts
  42. go:
  43.     mov sp,#stack        ; Wichtig!!! Stack einrichten
  44.     
  45.      setb TCON.4            ; TR0 Timer 0 laeuft
  46.     anl TMOD,#%11111100    ; Mode-Bits ausblenden
  47.     orl TMOD,#%11        ; M0=3: Interruptfrq. etwa 3.9KHz
  48.     setb IE.7            ; Gennerell Interrupts zulassen
  49.     setb IE.1            ; T0 Interrupt Ein
  50.     setb IP.1            ; TO Interrupt Hohe Prioritaet
  51.  
  52.     mov speed0,#1        ; Motor1: Speed -64..0..64 (hier vorw.)
  53.     mov nach0,#0        ;           Nachkommastellen
  54.     mov pos0,#0            ;           Motor1 an Position 0!
  55.     mov speed1,#-1        ; Motor2: (hier rueckwaerts)
  56.     mov nach1,#0        ;
  57.     mov pos1,#0            ;
  58.  
  59. ; * Warteschleife: Abwechelnd werden MIDI-Bytes an speed0/1 verteilt.
  60.     clr IE.4            ; Seriellen Interrupt verbieten
  61.     clr SCON.0            ; Serieller Buffer loeschen
  62. loop:
  63.     cpl P3.5            ; Anzeigen ueber LED
  64.     jnb SCON.0,!        ; RI=1 abwarten
  65.     clr SCON.0            ; quittieren
  66.     mov speed0,SBUF        ; Byte an speed0
  67.     jnb SCON.0,!
  68.     clr SCON.0        
  69.     mov speed1,SBUF        ; Byte an speed1
  70.     sjmp loop
  71.  
  72. ; *** Stepper-Interrupt, wird mit 3.9 kHz aufgerufen ***
  73. steppen:
  74.     push ACC            ; Akku retten
  75.     push PSW
  76. ; * Step-Routine fuer Motor 0 *
  77.     mov A,nach0            ; Addieren
  78.     add A,speed0        ; des Steps
  79.     mov nach0,A            ; und Abspeichern...
  80.     jnb PSW.2,nstep0    ; Overflow-Flag testen
  81.     mov awert,#1        ; Hilfsv: Vorwaerts
  82.     jb ACC.7,vor0        ; >$80: Vorwaerts ist ok
  83.     mov awert,#-1        ; sonst Hilfs Rueckwaerts!
  84. vor0:
  85.     mov A,pos0            ; Position 0 holen
  86.     add A,awert            ; 1 Step vor/zurueck
  87.     anl A,#%0011        ; 4 Steps fuer Motor 0
  88.     mov pos0,A            ; Neue Position merken
  89. nstep0:
  90.  
  91. ; * Step-Routine fuer Motor 1 *
  92.     mov A,nach1            ; wie Motor 0
  93.     add A,speed1        ; ...
  94.     mov nach1,A    
  95.     jnb PSW.2,nstep1
  96.     mov awert,#4        ; Vorw. in 4-er Schritten
  97.     jb ACC.7,vor1
  98.     mov awert,#-4        ; sonst 4 Rueckwaerts!
  99. vor1:
  100.     mov A,pos1            ; Position 1 holen
  101.     add A,awert
  102.     anl A,#%1100        ; 4 Steps fuer M. 1 (0,4,8,12)
  103.     mov pos1,A
  104. nstep1:
  105.  
  106. ; * Ausgaenge schalten in Abh. von pos0/1 *
  107.     mov A,pos0            ; 0..3 Step 1
  108.     add A,pos1            ; 0..15 Step 4
  109.     add    A,#pot-h1        ; Adressdifferez zur Tab.
  110.     movc A,@A+pc        ; Indiziert aus Tabelle holen
  111. h1:    mov P1,A            ; Bitmuster am Port ausgeben
  112.  
  113.     pop PSW
  114.     pop ACC                ; Akku restaurieren
  115.     reti                ; Interrupt fertig!
  116.  
  117. ; * Positionstabelle Tabelle fuer 16 Motorstrommoeglichkeiten *
  118. pot:
  119.     .dc.b $AA,$A9,$A5,$A6,$9A,$99,$95,$96
  120.     .dc.b $5A,$59,$55,$56,$6A,$69,$65,$66
  121.     
  122.